package com.ushine.web.component.task.template;

import com.ushine.web.component.exception.ServiceException;
import com.ushine.web.component.task.AsyncConstant;
import com.ushine.web.component.task.AsyncTaskManager;
import com.ushine.web.component.task.handler.AsyncTaskConstructor;
import com.ushine.web.component.task.model.AsyncTaskInfoDO;
import com.ushine.web.template.mybatis.model.DemoDO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @Author: yls
 * @Date: 2022/02/21 11:38
 * @Description: 任务调度模板
 * @Version 1.0
 */
@Slf4j
@Component
public class AsyncTaskTemplate {

    /**
     * 注入异步任务管理器
     */
    @Resource
    AsyncTaskManager<DemoDO> asyncTaskManager;

    /**
     * 功能描述:
     * 〈任务执行的具体内容〉
     *
     * @param taskInfo 任务信息,携带一个泛型的实体类参数
     * @return : void
     * @author : yls
     * @date : 2022/02/21 11:43
     */
    public void executorRunnable(AsyncTaskInfoDO<DemoDO> taskInfo) throws ServiceException {
        taskInfo = asyncTaskManager.initTask(taskInfo);
        Long taskId = taskInfo.getId();
        /*
         * submit方法共三个参数：
         * taskType 任务类型
         * asyncTaskInfo 任务信息
         * asyncTaskConstructor 任务构造器
         */
        asyncTaskManager.submit(AsyncConstant.BUSINESS_EXECUTOR, taskInfo, new AsyncTaskConstructor() {
            @Override
            public void init() {
                // 非必要可以不重写
                log.info("{}：任务执行前需要准备的资源或者工作：！！！", taskId);
            }

            @Override
            public void asyncRunnable() {
                // 具体的任务逻辑,任务执行的主方法，必须重写
                log.info("{}：任务执行的具体内容：！！！", taskId);
            }

            @Override
            public void releaseResource() {
                // 非必要可以不重写
                log.info("{}：任务释放资源需要做的事！！！", taskId);
            }

            @Override
            public void exception(Exception e) throws ServiceException {
                // 非必要可以不重写
                log.info("{}：任务发送异常需要做的事！！！", taskId);
            }

            @Override
            public void finish() {
                // 非必要可以不重写
                log.info("{}：任务执行完成后需要做的事情！！！", taskId);
            }
        });
    }
}
